#ifndef _norm_2_hpp_
#define _norm_2_hpp_

#include "detail/norm_2_impl.hpp"

namespace core {

    namespace math {

        /** \brief calculates \f$|| . ||_2^2\f$*/
        template<class T>
            typename field<T>::type   norm_2_sqr(const T& v)
            {
                typedef typename detail::choose_norm_2_sqr_impl<T>::type impl_type;
                return impl_type::eval(v);
            }

        /** \brief calculates \f$||.||_2\f$*/
        template<class T>
            typename field<T>::type   norm_2(const T& v)
            {
                using std::sqrt;
                return sqrt(norm_2_sqr(v));
            }
    } // namespace math

} // namespace core

#endif // _norm_2_hpp_
